package jp.co.menox.controller.tmserver.borrow;

import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import jp.co.menox.controller.tmserver.TmServerControllerBase;
import jp.co.menox.tmserver.service.LendingHistoryService;
import jp.co.menox.tmcommon.common.DataConst;
import jp.co.menox.tmcommon.meta.LendingHistoryMeta;
import jp.co.menox.tmcommon.model.Lending;
import jp.co.menox.tmcommon.model.LendingHistory;
import jp.co.menox.tmserver.service.CategoryService;
import jp.co.menox.tmserver.service.LendingService;
import org.slim3.controller.Navigation;
import org.slim3.controller.validator.Validators;
import org.slim3.util.BeanUtil;
import org.slim3.util.CopyOptions;

/**
 * 借りたいもの予約実行
 * @author
 *
 */
public class RequestBorrowingReserveController extends TmServerControllerBase {

    protected LendingService service;
    protected LendingHistoryService lendingHistoryservice;
    protected CategoryService categoryService;
    {
        service = new LendingService();
        lendingHistoryservice = new LendingHistoryService();
        categoryService = new CategoryService();
    }

    @Override
    public Navigation run() throws Exception {
        String lendingId = request.getParameter("lendingId");
        long id = Long.parseLong(lendingId);
        Lending model = service.select(id);
        if (model == null) {
            return forward("internal_error.jsp");
        }

        if (!isPost() || !isValid()) {
            // 表示用mapの取得
            Map<Long, String> categoryMap = categoryService.getCategoryMap();
            Map<Long, String> userMap = userService.getUserMap();
            // 表示用変数設定
            requestScope("lending", model);
            requestScope("cateMap", categoryMap);
            requestScope("userMap", userMap);
            
            return forward("borrowingReserve.jsp");
        }

        // 登録用model
        LendingHistory historyModel = new LendingHistory();
        // 入力値を設定
        LendingHistoryMeta m = LendingHistoryMeta.get();
        BeanUtil.copy(request, historyModel, 
            (new CopyOptions()).dateConverter("yyyy/MM/dd", m.fromDate.getName(), m.toDate.getName()));

        // 予約する
        //　TBL：「貸し借り履歴」に「ステータス：未承認」で新規レコード追加

//        /** 貸したいものID */     private long lendingId; 必須
//        /** 貸与者ID */        private long lendingUser; 必須
//        /** 借用者ID */        private long borrowingUser; 必須
//        /** 個数 */             private int count; 必須
//        /** 貸出希望日 */        private Date fromDate; 必須
//        /** 返却予定日 */        private Date toDate; 必須
//        /** ステータス */          private int statusType; 必須
//        /** 申請日（予約日） */    private Date requestDate; 必須
//        /** 承認日 */           private Date approvalDate;
//        /** 貸出日 */           private Date lentDate;
//        /** 返却予定日 */        private Date returnPlanDate;
//        /** 返却日 */           private Date returnedDate;
//        /** 申請却下日 */        private Date rejectedDate;
//        /** キャンセル日 */        private Date cancelDate;
//        /** キャンセルユーザ */      private long cancelUser;
//        /** シェアリングID */       private String sharingId;

//        historyModel.setLendingId(id);
        historyModel.setLendingUser(model.getUserId());
        historyModel.setBorrowingUser(this.<Long>sessionScope("UserId"));
//        historyModel.setCount(count);
//        historyModel.setFromDate(fromDate);
//        historyModel.setToDate(toDate);
        historyModel.setStatusType(DataConst.STATUS_MISYOUNIN);

        Calendar current = Calendar.getInstance();
        current.set(Calendar.HOUR_OF_DAY, 0);
        current.set(Calendar.MINUTE, 0);
        current.set(Calendar.SECOND, 0);
        historyModel.setRequestDate(current.getTime());
        
        // デモのため
        historyModel.setLentDate(historyModel.getFromDate());
        historyModel.setReturnPlanDate(historyModel.getToDate());
        

//        historyModel.setApprovalDate(null);
//        historyModel.setLentDate(null);
//        historyModel.setReturnPlanDate(null);
//        historyModel.setReturnedDate(null);
//        historyModel.setRejectedDate(null);
//        historyModel.setCancelDate(null);
//        historyModel.setCancelUser(0);
//        historyModel.setSharingId(null);

        lendingHistoryservice.insert(historyModel);

        return forward("borrowingReserveResult.jsp");
    }

    /**
     * 入力値のvalidation
     * @return
     */
    private boolean isValid() {
        Validators v = new Validators(request);
        v.add("fromDate", v.required(), v.dateType("yyyy/MM/dd"));
        v.add("toDate", v.required(), v.dateType("yyyy/MM/dd"));

        // TODOF: 元の物品の貸与可能日を考慮する必要がある
        
        return v.validate();
    }

}
